home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_06 / prince / arcfuncs.c < prev    next >
Text File  |  1994-01-24  |  2KB  |  60 lines

  1. /* Atan2 function,float precision */
  2. #include "xmath.h"
  3.  
  4. float (atan2f) (float x, float y) {
  5.   int invert;
  6.   float x2, x4, xi;
  7.   double xd;
  8.   union {
  9.     float f;
  10.     long i;
  11.   } xx, yy;
  12.   /* Reduce to 1st or last octant; atan2f(0,0) = NaN */
  13.   xi = x / y;
  14. #ifdef INLINE_FABS        /* need inline code for efficiency */
  15.   if (invert = fabsf(y) < fabsf(x))
  16. #else                /* cheap non-portable fabsf() */
  17.   xx.f = x;
  18.   yy.f = y;
  19.   if (invert = (yy.i & ~_DSIGN) < (xx.i & ~_DSIGN))
  20.   #endif
  21.     xi = y / x;
  22.   x2 = xi * xi;
  23.   x4 = x2 * x2;
  24. /* Coefficients determined by Chebyshev fit */
  25.   xi += ((x4 * (-0.01600503f + x2 * .00283406f) +
  26.     -0.07495445f + x2 * .04258761f) * (x4 * x4)
  27.          + (-0.14202571f + x2 * .10636754f) * x4
  28.          + -0.33333067f + x2 * .19992484f) * (xi * x2);
  29.   if (invert) {            /* octants 2,3,6,7 */
  30.     /* Certain compilers don't parallelize constant loads unless
  31.      * they come before the comparison */
  32.     xd = M_PI_2;
  33.     return(x < 0 ? -xd : xd) - xi;
  34.   }
  35. #ifdef INLINE_FABS
  36.   if (y >= 0)
  37.   #else
  38.   if (yy.i >= 0)
  39.   #endif
  40.     return xi;        /* octants 1,8 */
  41.   x4 = xi + (float) M_PI;    /* octant 4 or 5 */
  42.   if (x < 0) x4 = xi - (float) M_PI;    /* octant 5 */
  43.   return x4;
  44. }
  45.  
  46. float (atanf) (float x) {
  47.   return atan2f(x, 1.f);
  48. }
  49.  
  50. float (asinf) (float x) {
  51. /* Sqrt instruction included in most modern architectures */
  52.   if (x < -1 || x > 1) errno = EDOM;
  53.   return atan2f(x, sqrt(1 - (double) x * x));
  54. }
  55.  
  56. float (acosf) (float x) {
  57.   if (x < -1 || x > 1) errno = EDOM;
  58.   return atan2f(sqrt(1 - (double) x * x), x);
  59. }
  60.